/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "core/shader_line.h"

#include "../底层绘图/底层绘图框架.h"
#include "引擎数据类型.h"



class S_单色材质 : public S_材质 {
	
public:
	S_单色材质(S_设备环境& ctx, bool 独立缩放);
	~S_单色材质();

	S_板载缓存* m_Color;
	S_板载缓存* m_材质属性;
	void f_set颜色(S_RGBA8UI color);
	S_材质* f_copy(S_单色材质* mat);
	virtual S_材质* f_copy() = 0;
};



class S_单色点材质: public S_单色材质 {
	static bool	m_是否以创建着色器;
public:
	S_单色点材质(S_设备环境& ctx);
	S_材质* f_copy();
};

class S_单色线框材质 : public S_单色材质 {
	static bool	m_是否以创建着色器;
public:
	S_单色线框材质(S_设备环境& ctx);
	S_材质* f_copy();
};

class S_单色面材质 : public S_单色材质 {
	static bool	m_是否以创建着色器;
public:
	S_单色面材质(S_设备环境& ctx);
	S_材质* f_copy();
};

class S_单色平直面材质 : public S_单色材质 {
	static bool	m_是否以创建着色器;
public:
	S_单色平直面材质(S_设备环境& ctx);
	S_材质* f_copy();
};

class S_单色描边材质 : public S_单色材质 {
	static bool	m_是否以创建着色器;
public:
	S_单色描边材质(S_设备环境& ctx);
	S_材质* f_copy();
};

class S_单色线段材质 : public S_单色材质 {
	static bool	m_是否以创建着色器;
public:
	S_单色线段材质(S_设备环境& ctx);
	S_材质* f_copy();
};

class S_单色连续线材质 : public S_单色材质 {
	static bool	m_是否以创建着色器;
public:
	S_单色连续线材质(S_设备环境& ctx);
	S_材质* f_copy();
};



class S_独立缩放单色材质 : public S_单色材质 {
	bool			m_是否以创建着色器;
	S_线管创建参数	线管参数;
	bool			m_独立缩放;
public:
	S_独立缩放单色材质(S_设备环境& ctx, E_绘制方式 绘制方式, E_填充模式 填充模式, bool 写入深度, bool 深度测试, bool 独立缩放);
	S_材质* f_copy();
};


class S_单色虚线材质 : public S_材质 {
	static bool	m_是否以创建着色器;
	S_线管创建参数	m_线管参数;
	bool			m_独立缩放;
	bool			m_是否连续;
public:
	S_单色虚线材质(S_设备环境& ctx, bool 是否连续);
	S_材质* f_copy();
};







class S_线逐顶点有色材质 : public S_材质 {
	static bool	m_是否以创建着色器;
public:
	S_线逐顶点有色材质(S_设备环境& ctx, bool 是否有深度遮挡, E_绘制方式 绘制方式 = E_绘制方式::e_画扇形);

	S_板载缓存* m_绘制参数;
	void f_set材质参数(float32 绘制距离, uint32 实例ID = 0);
};
class S_线逐顶点有色线段材质 : public S_材质 {
	static bool	m_是否以创建着色器;
public:
	S_线逐顶点有色线段材质(S_设备环境& ctx, bool 是否有深度遮挡, E_绘制方式 绘制方式, E_填充模式 填充模式 = E_填充模式::e_填充线);

	S_板载缓存* m_绘制参数;
	void f_set材质参数(float32 绘制距离, uint32 实例ID = 0);
};
class S_扇形线逐顶点有色材质 : public S_材质 {
	static bool	m_是否以创建着色器;
public:
	S_扇形线逐顶点有色材质(S_设备环境& ctx, bool 是否有深度遮挡);

	S_板载缓存* m_绘制参数;
	void f_set材质参数(float32 绘制距离, uint32 实例ID = 0);
};
class S_线逐顶点有色连续线材质 : public S_材质 {
	static bool	m_是否以创建着色器;
public:
	S_线逐顶点有色连续线材质(S_设备环境& ctx, bool 是否有深度遮挡);
	~S_线逐顶点有色连续线材质();
	//S_板载缓存* m_绘制参数;
	void f_set材质参数(float32 绘制距离, uint32 实例ID = 0);
};





class S_单色逐顶点线描边材质 : public S_材质 {
	static bool	m_是否以创建着色器;
public:
	S_单色逐顶点线描边材质(S_设备环境& ctx);

	S_板载缓存* m_Color;
	void f_set颜色(S_RGBA8UI color, uint32 实例ID = 0);
};













//包含顶点和法线
class S_基本光照描边材质 : public S_材质 {
	static bool	m_是否以创建着色器;
public:
	S_基本光照描边材质(S_设备环境& ctx, E_绘制方式 绘制方式 = E_绘制方式::e_三角形);

	//S_板载缓存* m_Color;
	S_板载缓存* m_灯光方向;

	//void f_set颜色(S_RGBA8UI color, uint32 实例ID = 0);
};

class S_面基本光照材质 : public S_材质 {
	static bool	m_是否以创建着色器;
public:
	S_面基本光照材质(S_设备环境& ctx);
	//S_板载缓存* m_Color;
	S_板载缓存* m_灯光方向;

	void f_set颜色(S_RGBA8UI color, uint32 实例ID = 0);
};


class S_线基本光照材质 : public S_材质 {
	static bool	m_是否以创建着色器;
public:
	S_线基本光照材质(S_设备环境& ctx);

	//S_板载缓存* m_Color;
	S_板载缓存* m_灯光方向;

	void f_set颜色(S_RGBA8UI color, uint32 实例ID = 0);

};

class S_权重可视材质 : public S_材质 {
	static bool	m_是否以创建着色器;
public:
	S_权重可视材质(S_设备环境& ctx, E_填充模式 填充模式);
	~S_权重可视材质();
	S_板载缓存* m_Color;
};

/*class S_权重可视线材质 : public S_材质 {
	static bool	m_是否以创建着色器;
public:
	S_权重可视线材质(S_设备环境& ctx);
	~S_权重可视线材质();
	S_板载缓存* m_Color;
};*/









class S_面纹理光照材质: public S_材质 {
	
public:
	S_面纹理光照材质(S_设备环境& ctx);

    S_纹理**    m_纹理;

	void f_set颜色(S_RGBA8UI color, uint32 实例ID=0);
};


class S_线纹理光照材质 : public S_材质 {

public:
	S_线纹理光照材质(S_设备环境& ctx);

    S_纹理**    m_纹理;

	void f_set颜色(S_RGBA8UI color, uint32 实例ID = 0);
};









class S_面物理光照材质: public S_材质 {
	
public:
	S_面物理光照材质(S_设备环境& ctx);

	S_板载缓存* m_Color;

	void f_set颜色(S_RGBA8UI color, uint32 实例ID=0);
};


class S_线物理光照材质 : public S_材质 {

public:
	S_线物理光照材质(S_设备环境& ctx);

	S_板载缓存* m_Color;

	void f_set颜色(S_RGBA8UI color, uint32 实例ID = 0);

};













class S_FLIP可视预览材质 : public S_材质 {

public:
	S_FLIP可视预览材质(S_设备环境& ctx);
	S_板载缓存* m_分辨率维度;
	//void f_set颜色(S_RGBA8UI color, uint32 实例ID = 0);
};




class S_PBF可视预览材质 : public S_材质 {

public:
	S_PBF可视预览材质(S_设备环境& ctx);
	S_板载缓存* m_GPU参数;
	void f_set颜色(vec4 color, uint32 实例ID = 0);
};




class S_体素可视网格预览材质 : public S_材质 {

public:
	S_体素可视网格预览材质(S_设备环境& ctx);
	S_板载缓存* m_颜色;
	S_板载缓存* m_GPU参数;
	//void f_set颜色(S_RGBA8UI color, uint32 实例ID = 0);
	void f_域绘制参数(const S_DomProp& 参数);

};

class S_八叉树可视预览材质 : public S_材质 {

public:
	S_八叉树可视预览材质(S_设备环境& ctx);
	S_板载缓存* m_颜色;
	S_板载缓存* m_GPU参数;
	//void f_set颜色(S_RGBA8UI color, uint32 实例ID = 0);
	void f_域绘制参数(const S_DomProp& 参数);

};

class S_VecSphere可视预览材质 : public S_材质 {
public:
	S_VecSphere可视预览材质(S_设备环境& ctx);
	S_板载缓存* m_颜色;
	//void f_set颜色(S_RGBA8UI color, uint32 实例ID = 0);
};

class S_Cube可视预览材质 : public S_材质 {
public:
	S_Cube可视预览材质(S_设备环境& ctx);
	S_板载缓存* m_颜色;
	void f_set颜色(S_RGBA8UI color, uint32 实例ID = 0);
};








class S_物理光照光追材质 : public S_材质 {
	static bool	m_是否以创建着色器;
public:
	S_物理光照光追材质(S_设备环境& ctx);

};





//一般每个物体分配一个元素
void f_material_add线属性(S_材质* material, uint32 num);
void f_material_del线属性(S_材质* material, uint32 ID);
void f_material_set线属性(S_材质* material, uint32 ID, const S_MeshTranformProp& 线属性);




